]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
boxpointer: reposition after a size change
authorDan Winship <danw@gnome.org>
Fri, 25 Mar 2011 14:04:28 +0000 (10:04 -0400)
committerDan Winship <danw@gnome.org>
Fri, 25 Mar 2011 22:55:06 +0000 (18:55 -0400)
If the BoxPointer changes size (eg, when opening the "More" section of
the network menu), reposition it to make sure it's still aligned
correctly and still completely on-screen.

This is not the right fix for this problem (and causes the menu to be
drawn in the wrong position for one frame). The right fix would
involve a ClutterConstraint, but that would be more invasive, and can
happen post-3.0.0.

https://bugzilla.gnome.org/show_bug.cgi?id=645647

js/ui/boxpointer.js

index 99de6f18c00925b5af5f882c623fa3bc097c67f8..619e0c552376a6dedb7d5e9922f4d27542db35b0 100644 (file)
@@ -2,6 +2,7 @@
 
 const Clutter = imports.gi.Clutter;
 const Lang = imports.lang;
+const Meta = imports.gi.Meta;
 const St = imports.gi.St;
 const Shell = imports.gi.Shell;
 
@@ -176,6 +177,18 @@ BoxPointer.prototype = {
                 break;
         }
         this.bin.allocate(childBox, flags);
+
+        if (this._sourceActor) {
+            Meta.later_add (Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
+                function () {
+                    // This won't cause a loop if _allocate() was
+                    // called as a result of repositioning, because in
+                    // that case _reposition() will set the same
+                    // coordinates again, which Clutter will just
+                    // ignore.
+                    this._reposition(this._sourceActor, this._gap, this._alignment);
+                }));
+        }
     },
 
     _drawBorder: function(area) {
@@ -306,6 +319,14 @@ BoxPointer.prototype = {
         // so that we can query the correct size.
         this.actor.show();
 
+        this._sourceActor = sourceActor;
+        this._gap = gap;
+        this._alignment = alignment;
+
+        this._reposition(sourceActor, gap, alignment);
+    },
+
+    _reposition: function(sourceActor, gap, alignment) {
         // Position correctly relative to the sourceActor
         let sourceNode = sourceActor.get_theme_node();
         let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());